import { NextRequest, NextResponse } from "next/server"; import { assertSameOrigin, currentUser, requireUser } from "@/lib/auth/session"; import { getListingFull, updateListing, deleteDraft, ConflictError, assertOwner } from "@/lib/listings/service"; import { ListingInput, publishProblems } from "@/lib/listings/types"; import { mediaUrl } from "@/lib/listings/media"; import { apiError, handle, parseBody } from "@/lib/api"; export const dynamic = "force-dynamic"; type P = { params: Promise<{ id: string }> }; export async function GET(_req: NextRequest, { params }: P) { try { const { id } = await params; const l = await getListingFull(id); if (!l) return apiError(404, "not_found", "Annonce introuvable"); const u = await currentUser(); const isOwner = !!u && (l.ownerUserId === u.id || u.roles.includes("ADMIN") || u.roles.includes("MODERATOR")); if (l.status !== "PUBLISHED" && !isOwner) return apiError(404, "not_found", "Annonce introuvable"); const media = l.media.map((m) => ({ id: m.id, url: mediaUrl(m.storageKey, 800), large: mediaUrl(m.storageKey, 1600), thumb: mediaUrl(m.storageKey, 320), position: m.position, altText: m.altText, width: m.width, height: m.height })); const problems = isOwner ? publishProblems({ listingType: l.listingType, propertyType: l.property.propertyType, priceAmount: l.priceAmount, title: l.title, description: l.description, city: l.property.city, lat: l.property.lat, mediaCount: l.media.length, attestedAt: l.attestedAt, bedrooms: l.property.bedrooms, areaSqft: l.property.areaSqft }) : undefined; return NextResponse.json({ listing: { ...l, media, ownerUserId: isOwner ? l.ownerUserId : undefined, problems } }); } catch (e) { return handle(e); } } export async function PATCH(req: NextRequest, { params }: P) { try { await assertSameOrigin(); const u = await requireUser(); const { id } = await params; const input = await parseBody(req, ListingInput); const l = await updateListing(id, u.id, u.roles, input); return NextResponse.json({ listing: l }); } catch (e) { if (e instanceof ConflictError) return apiError(409, "conflict", e.message); return handle(e); } } export async function DELETE(_req: NextRequest, { params }: P) { try { await assertSameOrigin(); const u = await requireUser(); const { id } = await params; const l = await getListingFull(id); if (l) assertOwner(l, u.id, u.roles); await deleteDraft(id, u.id, u.roles); return NextResponse.json({ ok: true }); } catch (e) { return handle(e); } }